home *** CD-ROM | disk | FTP | other *** search
/ Skunkware 5 / Skunkware 5.iso / src / Tools / glimpse-2.1 / compress / trecursive.c < prev    next >
Encoding:
C/C++ Source or Header  |  1995-05-16  |  1.8 KB  |  91 lines

  1. /* Copyright (c) 1994 Burra Gopal, Udi Manber.  All Rights Reserved. */
  2.  
  3. #include <stdio.h>
  4. #include <sys/types.h>
  5. #if    DIRENT
  6. #include <dirent.h>
  7. #else    /*DIRENT*/
  8. #include <sys/dir.h>
  9. #endif    /*DIRENT*/
  10. #include <sys/stat.h>
  11. #include <fcntl.h>
  12. #define DIRSIZE 14
  13.  
  14. #if    0
  15. #define FUNCTION(x, y, z)    treewalk(x, y, z)
  16. #define MAX_LINE_LEN        1024
  17.  
  18. main(argc, argv)
  19. int argc; char **argv;
  20. {
  21.     char buf[MAX_LINE_LEN];
  22.     char outbuf[MAX_LINE_LEN];
  23.     int flags=0;
  24.  
  25.     if (argc == 1) {
  26.         strcpy(buf, ".");
  27.         return treewalk(buf, outbuf, flags);
  28.     }
  29.     else while(--argc > 0) {
  30.         strcpy(buf, *++argv);
  31.         return treewalk(buf, outbuf, flags);
  32.     }
  33. }
  34.  
  35. int
  36. treewalk(name, outname, flags)
  37. char *name;
  38. char *outname;
  39. int flags;
  40. {
  41.     struct stat stbuf;
  42.     extern int puts();
  43.  
  44.     if(lstat(name, &stbuf) == -1) {
  45.         fprintf(stderr, "permission denied or non-existent: %s\n", name);
  46.         return -1;
  47.     }
  48.     if ((stbuf.st_mode & S_IFMT) == S_IFLNK)
  49.         return -1;
  50.     if ((stbuf.st_mode & S_IFMT) == S_IFDIR) 
  51.         return DIRECTORY(name, outname, flags);
  52.     if ((stbuf.st_mode & S_IFMT) == S_IFREG)
  53.         return puts(name);
  54. }
  55. #endif    /*0*/
  56.  
  57. int
  58. DIRECTORY(name, outname, flags)
  59. char *name, *outname;
  60. int flags;
  61. {
  62. #if    DIRENT
  63.     struct dirent *dp;
  64. #else    /*DIRENT*/
  65.     struct direct *dp;
  66. #endif    /*DIRENT*/
  67.     char *nbp;
  68.     DIR *dirp;
  69.  
  70.     nbp = name + strlen(name);
  71.     if( nbp+DIRSIZE+2 >= name+MAX_LINE_LEN ) {    /* name too long */
  72.         fprintf(stderr, "name too long: %.32s...\n", name);
  73.         return -1;
  74.     }
  75.     if((dirp = opendir(name)) == NULL) {
  76.         fprintf(stderr, "permission denied: %s\n", name);
  77.         return -1;
  78.     }
  79.     *nbp++ = '/';
  80.     for (dp = readdir(dirp); dp != NULL; dp = readdir(dirp)) {
  81.         if (strcmp(dp->d_name, ".") == 0 || strcmp(dp->d_name, "..")==0) {
  82.             continue;
  83.         }
  84.         strcpy(nbp, dp->d_name);
  85.         FUNCTION(name, outname, flags);
  86.     }
  87.     closedir (dirp);
  88.     *--nbp = '\0'; /* restore name */
  89.     return 0;
  90. }
  91.